热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RocketMQ|解耦、异步、削峰原理解析

文章目录前言先说说MQ的作用:一、RocketMQ的组成二、RocketMQ的整体架构三、RocketMQ有序消息乱序现象参考前言开门见山的说,MQ肯


文章目录

        • 前言
        • 先说说MQ的作用:
        • 一、 RocketMQ的组成
        • 二、RocketMQ的整体架构
      • 三、RocketMQ有序消息
        • 乱序现象
        • 参考


前言

开门见山的说,MQ肯定是有用的,不然这么多人用它干嘛(当然可能有人觉得可以装逼用2333)
在这里插入图片描述
不过这次我们要说的RocketMQ可不是美国进口的技术,是阿里巴巴捐赠给apache,让apache孵化用的。

RocketMQ提供at least once的语义,消息不会丢,但是有可能重复,业务上如果对重复接受度低的话,需要在业务层面规避重复带来的影响,比如去重或者幂等

阿里巴巴官方给出的RocketMQ的特点


  • 是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。
  • Producer、Consumer、队列都可以分布式。
  • Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应的所有队列,如果做集群消费,则多个Consumer实例平均消费这个topic对应的队列集合。
  • 能够保证严格的消息顺序
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 亿级消息堆积能力
  • 较少的依赖

先说说MQ的作用:


  • 解耦
    假如现在两个系统,当B系统crash掉,A系统也就凉了,这就是耦合带来的问题。
    在这里插入图片描述
    假如我现在用消息队列,就是这样子的。
    在这里插入图片描述
    即使B系统crash,A系统照常运行,A只需要把消息给到消息队列就可以。
  • 异步
    假如现在有这么个业务场景,分别有三个系统,用户支付成功后,支付系统调用生成订单系统来生成订单,再继续调用通知用户业务系统,最后返回给支付系统,是不是支付系统要等半天?

用户就想了,我tm等半天才能下个单,以后不在你这买了,这就损失了一名客户
在这里插入图片描述
加上消息队列会咋样?
在这里插入图片描述
依然是一个链式调用,不同的是,这次支付系统把任务信息告诉消息队列就可以了,剩下的事情,他就不管了,而是又消息队列和其他系统合作去完成。


  • 削峰
    RocketMQ可是阿里巴巴拿来抗双十一的中间件,你说刚不刚?

我们都知道,如果同时给服务器本不该承受的压力,它就会宕机。

而消息队列在削峰方面的思想就是,把大量的订单都放到消息队列里,挨个去处理,这样的结果可能是有的用户下单要等的久一些才能成功,但是好处就在于服
务器不会凉凉鸭,如果凉了,还卖啥?


一、 RocketMQ的组成

在这里插入图片描述


  • Message : 消息

  • Broker: RocketMQ的核心模块,负责接收并存储消息。

  • NameServer: RocketMQ的注册中心,集群的Topic-Queue的路由配置;Broker的实时配置信息。其它模块通过Nameservr提供的接口获取最新的Topic配置和路由信息。

  • Topic :用于将消息按主题做划分,Producer将消息发往指定的Topic,Consumer订阅该Topic就可以收到这条消息。Topic跟发送方和消费方都没有强关联关系,发送方可以同时往多个Topic投放消息,消费方也可以订阅多个Topic的消息。在RocketMQ中,Topic是一个上逻辑概念。消息存储不会按Topic分开。

  • Tag: 标签可以被认为是对 Topic 进一步细化。一般在相同业务模块中通过引入标签来标记不同用途的消息,Tag也可以对消息进行快速的过滤,例如后面consumer在subscribe的时候可指定tag,如果不需要过滤,设置为*即可。

  • Producer:消息的生产者

  • Consumer:消息的消费者


二、RocketMQ的整体架构

在这里插入图片描述
从上面抽象来看,RocketMQ的原理在于:


  • 生产者将消息给到队列(Broker)
  • 队列中的消息在逻辑上是以Topic来分类的,进一步还可以通过Tag来过滤
  • 消费者消费消息
    在这里插入图片描述

从下面这个图,可以看到Rocket MQ天生就是分布式的,Broker作为存储消息的核心组件,支持主从机制,一个挂了,我还有备用呢。

无论是Broker还是Name Server 都可以做分布式,从而让整个系统变得高可用
在这里插入图片描述


  • 每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
  • Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息。
  • Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息。

三、RocketMQ有序消息

实现顺序消费消息,需要把这些消息放到同一个queue中,所以需要指定相同的partition key

并设置orderly=true


乱序现象


  • 双机房容灾:容灾切换的时候,会切换机房,故障恢复后,会消费故障出现前的数据,此时无法保证有序
  • 扩容:扩容会导致queue增加,导致不同queue中可能出现相同的key,不能保证有序性

参考

https://www.cnblogs.com/qdhxhz/p/11094624.html
http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/

本人水平有限,希望各位不吝赐教。


推荐阅读
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
  • Spark与HBase结合处理大规模流量数据结构设计
    本文将详细介绍如何利用Spark和HBase进行大规模流量数据的分析与处理,包括数据结构的设计和优化方法。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本报告对2018年湘潭大学程序设计竞赛在牛客网上的时间数据进行了详细分析。通过统计参赛者在各个时间段的活跃情况,揭示了比赛期间的编程频率和时间分布特点。此外,报告还探讨了选手在准备过程中面临的挑战,如保持编程手感、学习逆向工程和PWN技术,以及熟悉Linux环境等。这些发现为未来的竞赛组织和培训提供了 valuable 的参考。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 在开发Xamarin.Forms应用程序时,遇到了使用Entity Framework Core 3.0访问SQLite数据库时 `Database.MigrateAsync` 方法调用的问题。本文详细探讨了该问题的根源,并提供了一种有效的解决方案,确保数据库迁移能够顺利执行。此外,还介绍了如何配置和优化EF Core以提高应用性能和稳定性。 ... [详细]
author-avatar
jzcpojwmds_652
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有